package qc.common.core.utils;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.MathContext;
import java.util.regex.Pattern;

/**
 * 数值转换工具类
 */
public class NumberUtil {
    
    //默认有效位数数字，默认保留2位小数
    private static Integer DEFAULT_DIGIT = 2;
    
    //默认格式化字符串，默认保留2位小数
    private static String DEFAULT_FORMAT_STR = "F2";

    /**
     * 按照指定的格式化字符串对数值进行格式化，Fn表示固定n位小数，Gn表示n位有效数字
     * 与前端处理一致
     * @param number 数值
     * @param formatStr 格式化字符串
     * @return String
     * @author QuCheng Tech
     * @since 2024/5/15
     */
    public static String parseNumberToString(double number,String formatStr){
        String prefix = "F"; //格式化前缀，默认为F表示固定小数位
        Integer digit = DEFAULT_DIGIT;
        if (StringUtils.isNotBlank(formatStr)){
            if (isInteger(formatStr)){
                digit = Integer.parseInt(formatStr);
            }else {
                prefix = formatStr.substring(0,1);
                digit = Integer.parseInt(formatStr.substring(1));
            }
        }
        
        if (prefix.equals("F") || prefix.equals("f")){
            //保留n位小数
            return String.format("%." + digit + "f",number);
        } else if (prefix.equals("G") || prefix.equals("g")) {
            //保留n位有效数字
            return getValidDigits(number,digit).toString();
        }
        return String.valueOf(number);
    }

    /**
     * 判断是否为整数
     * @param str 传入的字符串
     * @return 是整数返回true,否则返回false
     */
    public static boolean isInteger(String str) {
        Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
        return pattern.matcher(str).matches();
    }

    /**
     * 获取有效位数数字
     * @param number 数值
     * @param digit 有效位数
     * @return BigDecimal
     */
    public static BigDecimal getValidDigits(double number,Integer digit) {
        BigDecimal bigDecimal = new BigDecimal(number);
        BigDecimal divisor = BigDecimal.ONE;
        MathContext mc = new MathContext(digit);
        return bigDecimal.divide(divisor,mc);
    }
    
}
